package activiti

import system.Department
import system.StaffMember

/**
 * 任务公共字段
 */
class CommonTask {
    /*
    发起部分
     */
    StaffMember creater    //发起人
    Department createrDpt; //业务发起人所属部门
    Date createrTime       //发起时间
    String title;          //流程主题
    String piid            //流程实例ID
    String templateName    //流程模板名称
    String templateNameZh  // 流程模板中文名称

    Long flowId;           // 流程流水号

    /** 公共部分 **/
    String commtaskCode;                // 单据编号
    String taskId;                //环节任务id
    String htName;                //环节任务名称
    String htNameZh;              //环节任务中文名称
    String formName               //环节对应的form 注册的组件名
    StaffMember operator          //操作人
    Department operatorDepartment //操作人部门
    Date operateDate              //操作时间
    Date limitDate                //受限时间
    String result                 //审批结果
    String opinion                //审批意见
    //String status = "待办"        //待办 暂存 ,完成
    int status;                   // 任务状态 1-暂存；2-完成
    Date taskDate //任务到达时间
    Long topFlowId;// 最顶层flowId
    /** 是否驳回*/
    Boolean sfbh
    Date dateCreated//创建时间
    Date lastUpdated//最后更新的时间

    String xmmc//项目名称
    String modelId//流程定义的id  =ActModel.id
    String picUrl//  流程图片url
    Long solutionId// 与 ActSolution 关联 用于 历史流程的查询配置
    static constraints = {

        commtaskCode nullable: true
        dateCreated nullable: true
        lastUpdated nullable: true
        creater nullable: true
        createrDpt nullable: true
        createrTime nullable: true
        title nullable: true
        piid nullable: true
        templateName nullable: true
        templateNameZh nullable: true
        flowId nullable: true
        sfbh nullable: true
        piid nullable: true
        taskId nullable: true
        htName nullable: true
        operator nullable: true
        operatorDepartment nullable: true
        operateDate nullable: true
        limitDate nullable: true
        result nullable: true
        opinion nullable: true
        formName nullable: true
        flowId nullable: true
        htNameZh nullable: true
        status nullable: true
        topFlowId nullable: true
        taskDate nullable: true
        xmmc nullable: true
        modelId nullable: true
        picUrl nullable: true
        solutionId nullable: true
    }
    static resultList = ["0": '不通过', "1": "通过"]

    /**
     * 添加配置 tablePerHierarchy：
     *   Grails默认使用的映射继承策略会把子类的所有字段合并放到父类对应的表中，这样会导致因过多的继承而
     *   产生较多字段的父表。
     */
    static mapping = {
        title sqlType: "LONGTEXT"
        tablePerHierarchy false
        sort "dateCreated"
    }

    static getResultList1() {
        def aa = []
        resultList.each { entry ->
            aa << entry.key
        }
        return aa.flatten()
    }

    //  对各个流程中需要在代办任务重查询的编码,添加在beforeInsert   和 chuliCode  两个方法中
    def beforeInsert() {
        if (this.hasProperty('code')) this.commtaskCode = this.code
        if (this.hasProperty('tzdCode')) this.commtaskCode = this.tzdCode
        if (this.hasProperty('contractCode')) this.commtaskCode = this.contractCode
        if (!this.commtaskCode) {
            this.commtaskCode = CommonTask.findByPiidAndCommtaskCodeIsNotNull(this.piid)?.commtaskCode
        }
    }

    static chuliCode(CommonTask commonTask) {
        if (commonTask.hasProperty('code')) commonTask.commtaskCode = commonTask.code
        if (commonTask.hasProperty('tzdCode')) commonTask.commtaskCode = commonTask.tzdCode
        if (commonTask.hasProperty('contractCode')) commonTask.commtaskCode = commonTask.contractCode
        if (!commonTask.save(flush: true)) {
            commonTask.errors.each { errors ->
                println errors
            }
        }
    }

    transient utilsService

    def buildDomain() {
        def b = [:] + this.properties
        b.remove('status')
        b.remove('mx1')
        b.remove('mx2')
        def param = [allowformat: true, allowprecision: false]
        b = utilsService.truncProp(this, b, param) { amap ->
            amap << ['id': this.id]
        }
        b
    }

    def buildDomainList(list) {
        def rds = []
        list.each {
            def b = [:] + it.properties
            b.remove('status')
            b.remove('mx1')
            b.remove('mx2')
            def param = [allowformat: true, allowprecision: false]
            b = utilsService.truncProp(it, b, param) { amap ->
                amap << ['id': it.id]

            }
            rds << b
        }
        return rds
    }
}
